if(WITH_TESTS)
add_executable(ceph_rgw_jsonparser
  rgw_jsonparser.cc)
target_link_libraries(ceph_rgw_jsonparser
  rgw_a
  global)

add_executable(ceph_rgw_multiparser
  rgw_multiparser.cc)
target_link_libraries(ceph_rgw_multiparser
  rgw_a
  global)

install(TARGETS
  ceph_rgw_jsonparser
  ceph_rgw_multiparser
  DESTINATION bin)
endif(WITH_TESTS)

add_custom_target(civetweb_h
  COMMAND ${CMAKE_COMMAND} -E make_directory
  "${CMAKE_BINARY_DIR}/src/include/civetweb"
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
  "${CMAKE_SOURCE_DIR}/src/civetweb/include/civetweb.h"
  "${CMAKE_BINARY_DIR}/src/include/civetweb"
  COMMENT "keep civetweb.h up-to-date")

find_program(GPERF gperf)
if(NOT GPERF)
  message(FATAL_ERROR "Can't find gperf")
endif()
function(gperf_generate input output)
  add_custom_command(
    OUTPUT ${output}
    COMMAND ${GPERF} ${input} | sed "s/register //g" > ${output}
    DEPENDS ${input}
    COMMENT "Generate ${output}"
    )
endfunction()

set(rgw_a_srcs
  rgw_acl.cc
  rgw_acl_s3.cc
  rgw_acl_swift.cc
  rgw_auth.cc
  rgw_auth_keystone.cc
  rgw_auth_s3.cc
  rgw_basic_types.cc
  rgw_bucket.cc
  rgw_cache.cc
  rgw_client_io.cc
  rgw_common.cc
  rgw_compression.cc
  rgw_cors.cc
  rgw_cors_s3.cc
  rgw_dencoder.cc
  rgw_env.cc
  rgw_es_query.cc
  rgw_formats.cc
  rgw_frontend.cc
  rgw_gc.cc
  rgw_http_client.cc
  rgw_http_client_curl.cc
  rgw_json_enc.cc
  rgw_keystone.cc
  rgw_ldap.cc
  rgw_loadgen.cc
  rgw_log.cc
  rgw_lc.cc
  rgw_lc_s3.cc
  rgw_metadata.cc
  rgw_multi.cc
  rgw_multi_del.cc
  rgw_sync.cc
  rgw_data_sync.cc
  rgw_otp.cc
  rgw_sync_module.cc
  rgw_sync_module_es.cc
  rgw_sync_module_es_rest.cc
  rgw_sync_module_log.cc
  rgw_sync_log_trim.cc
  rgw_sync_trace.cc
  rgw_period_history.cc
  rgw_period_puller.cc
  rgw_period_pusher.cc
  rgw_realm_reloader.cc
  rgw_realm_watcher.cc
  rgw_reshard.cc
  rgw_coroutine.cc
  rgw_cr_rados.cc
  rgw_object_expirer_core.cc
  rgw_op.cc
  rgw_os_lib.cc
  rgw_policy_s3.cc
  rgw_process.cc
  rgw_quota.cc
  rgw_rados.cc
  rgw_replica_log.cc
  rgw_request.cc
  rgw_resolve.cc
  rgw_rest_bucket.cc
  rgw_rest.cc
  rgw_rest_client.cc
  rgw_rest_config.cc
  rgw_rest_conn.cc
  rgw_rest_log.cc
  rgw_rest_metadata.cc
  rgw_rest_opstate.cc
  rgw_rest_realm.cc
  rgw_rest_replica_log.cc
  rgw_rest_role.cc
  rgw_rest_s3.cc
  rgw_rest_swift.cc
  rgw_rest_usage.cc
  rgw_rest_user.cc
  rgw_role.cc
  rgw_string.cc
  rgw_swift_auth.cc
  rgw_tag.cc
  rgw_tag_s3.cc
  rgw_tools.cc
  rgw_usage.cc
  rgw_user.cc
  rgw_website.cc
  rgw_xml.cc
  rgw_xml_enc.cc
  rgw_torrent.cc
  rgw_crypt.cc
  rgw_crypt_sanitize.cc
  rgw_iam_policy.cc)

gperf_generate(${CMAKE_SOURCE_DIR}/src/rgw/rgw_iam_policy_keywords.gperf
  rgw_iam_policy_keywords.frag.cc)
set_source_files_properties(rgw_iam_policy.cc PROPERTIES
  OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/src/rgw/rgw_iam_policy_keywords.frag.cc
  COMPILE_FLAGS -I${CMAKE_BINARY_DIR}/src/rgw)


if (WITH_RADOSGW_FCGI_FRONTEND)
  list(APPEND rgw_a_srcs rgw_fcgi.cc)
endif()

add_library(rgw_a STATIC ${rgw_a_srcs})

add_dependencies(rgw_a civetweb_h)

target_include_directories(rgw_a SYSTEM PUBLIC "../rapidjson/include")

if(WITH_LTTNG)
  add_dependencies(rgw_a rgw_op-tp rgw_rados-tp)
endif()

target_link_libraries(rgw_a librados cls_otp_client cls_lock_client cls_rgw_client cls_refcount_client
  cls_log_client cls_statelog_client cls_timeindex_client cls_version_client
  cls_replica_log_client cls_user_client ceph-common common_utf8 global
  ${CURL_LIBRARIES}
  ${EXPAT_LIBRARIES}
  ${OPENLDAP_LIBRARIES} ${CRYPTO_LIBS}
  oath)

if (WITH_RADOSGW_BEAST_FRONTEND)
  target_compile_definitions(rgw_a PUBLIC BOOST_COROUTINES_NO_DEPRECATION_WARNING)
  target_link_libraries(rgw_a Boost::coroutine Boost::context)
endif()

if (WITH_CURL_OPENSSL)
  target_link_libraries(rgw_a ${OPENSSL_LIBRARIES})
endif (WITH_CURL_OPENSSL)

set(radosgw_srcs
  rgw_loadgen_process.cc
  rgw_civetweb.cc
  rgw_civetweb_frontend.cc
  rgw_civetweb_log.cc)

if (WITH_RADOSGW_FCGI_FRONTEND)
  list(APPEND radosgw_srcs rgw_fcgi_process.cc)
endif()

if (WITH_RADOSGW_BEAST_FRONTEND)
  list(APPEND radosgw_srcs
    rgw_asio_client.cc
    rgw_asio_frontend.cc)
endif (WITH_RADOSGW_BEAST_FRONTEND)

add_library(radosgw_a STATIC ${radosgw_srcs}
  $<TARGET_OBJECTS:civetweb_common_objs>)
if (WITH_RADOSGW_BEAST_FRONTEND AND WITH_RADOSGW_BEAST_OPENSSL)
  target_link_libraries(radosgw_a rgw_a ${SSL_LIBRARIES})
endif()

add_executable(radosgw rgw_main.cc)
target_link_libraries(radosgw radosgw_a librados
  cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
  cls_log_client cls_statelog_client cls_timeindex_client
  cls_version_client cls_replica_log_client cls_user_client
  global ${FCGI_LIBRARY} ${LIB_RESOLV}
  ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES}
  ${ALLOC_LIBS})
# radosgw depends on cls libraries at runtime, but not as link dependencies
add_dependencies(radosgw cls_rgw cls_lock cls_refcount
  cls_log cls_statelog cls_timeindex
  cls_version cls_replica_log cls_user)
install(TARGETS radosgw DESTINATION bin)

if (WITH_RADOSGW_BEAST_FRONTEND)
  target_link_libraries(radosgw_a ${OPENSSL_LIBRARIES})
endif()

set(radosgw_admin_srcs
  rgw_admin.cc
  rgw_orphan.cc)
add_executable(radosgw-admin ${radosgw_admin_srcs})
target_link_libraries(radosgw-admin rgw_a librados
  cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
  cls_log_client cls_statelog_client cls_timeindex_client
  cls_version_client cls_replica_log_client cls_user_client
  global ${FCGI_LIBRARY} ${LIB_RESOLV}
  ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES})
install(TARGETS radosgw-admin DESTINATION bin)

set(radosgw_es_srcs
  rgw_es_main.cc)
add_executable(radosgw-es ${radosgw_es_srcs})
target_link_libraries(radosgw-es rgw_a librados
  cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
  cls_log_client cls_statelog_client cls_timeindex_client
  cls_version_client cls_replica_log_client cls_user_client
  global ${FCGI_LIBRARY} ${LIB_RESOLV}
  ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES})
install(TARGETS radosgw-es DESTINATION bin)

set(radosgw_token_srcs
  rgw_token.cc)
add_executable(radosgw-token ${radosgw_token_srcs})
target_link_libraries(radosgw-token librados
  global ${ALLOC_LIBS})
install(TARGETS radosgw-token DESTINATION bin)

set(radosgw_object_expirer_srcs
  rgw_object_expirer.cc)
add_executable(radosgw-object-expirer ${radosgw_object_expirer_srcs})
target_link_libraries(radosgw-object-expirer rgw_a librados
  cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
  cls_log_client cls_statelog_client cls_timeindex_client
  cls_version_client cls_replica_log_client cls_user_client
  global ${FCGI_LIBRARY} ${LIB_RESOLV}
  ${CURL_LIBRARIES} ${EXPAT_LIBRARIES})
install(TARGETS radosgw-object-expirer DESTINATION bin)

set(librgw_srcs
  librgw.cc
  rgw_file.cc)
add_library(rgw SHARED ${librgw_srcs})
target_link_libraries(rgw PRIVATE
  rgw_a
  librados
  cls_rgw_client
  cls_otp_client
  cls_lock_client
  cls_refcount_client
  cls_log_client
  cls_statelog_client
  cls_timeindex_client
  cls_version_client
  cls_replica_log_client
  cls_user_client
  global
  ${LIB_RESOLV}
  ${CURL_LIBRARIES}
  ${EXPAT_LIBRARIES})
set_target_properties(rgw PROPERTIES OUTPUT_NAME rgw VERSION 2.0.0
  SOVERSION 2)
install(TARGETS rgw DESTINATION ${CMAKE_INSTALL_LIBDIR})

if(WITH_EMBEDDED)
  include(MergeStaticLibraries)
  add_library(cephd_rgw_base STATIC rgw_main.cc ${radosgw_admin_srcs})
  if(WITH_RADOSGW_FCGI_FRONTEND)  
    target_include_directories(cephd_rgw_base SYSTEM PUBLIC ${FCGI_INCLUDE_DIR})
  endif()
  set_target_properties(cephd_rgw_base PROPERTIES COMPILE_DEFINITIONS BUILDING_FOR_EMBEDDED)
  merge_static_libraries(cephd_rgw cephd_rgw_base rgw_a radosgw_a)
  if(WITH_RADOSGW_FCGI_FRONTEND) 
    target_link_libraries(cephd_rgw ${FCGI_LIBRARY})
  endif()
endif()
